import asyncio
import datetime


async def wait_until_specific_hour(target_hour=6):
    while True:
        now = datetime.datetime.now()

        # 计算目标时间（今天或明天的指定小时）
        if now.hour < target_hour:
            # 如果当前时间早于目标时间，今天就能到达
            target_time = datetime.datetime.combine(now.date(), datetime.time(target_hour, 0, 0))
        else:
            # 如果当前时间晚于目标时间，需要等到明天
            tomorrow = now.date() + datetime.timedelta(days=1)
            target_time = datetime.datetime.combine(tomorrow, datetime.time(target_hour, 0, 0))

        wait_seconds = (target_time - now).total_seconds()

        # 分段等待，避免长时间sleep无法响应中断
        max_sleep = 3600  # 每次最多等待1小时
        sleep_time = min(wait_seconds, max_sleep)

        if sleep_time <= 0:
            break

        await asyncio.sleep(sleep_time)


def valid_sign_time(now: float, time_range: dict) -> int:
    if time_range["StartTime"] <= now <= time_range["EndTime"]:
        return 1 # 在签到时间内
    if time_range["StartTime"] <= now:
        return 2 # 已过签到时间
    if now <= time_range["EndTime"]:
        return 0 # 未到签到时间
    return -1


def timestamp_to_text(timestamp):
    """
    将秒级或毫秒级时间戳转换为可读的时间文本

    参数:
        timestamp: 时间戳，可以是秒级(10位)或毫秒级(13位)

    返回:
        格式化后的时间字符串，格式为: YYYY-MM-DD HH:MM:SS
    """
    try:
        # 判断是秒级还是毫秒级时间戳
        if len(str(int(timestamp))) == 13:
            # 毫秒级时间戳，转换为秒
            timestamp = timestamp / 1000.0
        elif len(str(int(timestamp))) == 10:
            # 秒级时间戳，无需处理
            pass
        else:
            raise ValueError("时间戳长度不正确，应为10位(秒级)或13位(毫秒级)")

        # 转换为datetime对象
        dt = datetime.datetime.fromtimestamp(timestamp)

        # 格式化为字符串
        return dt.strftime("%Y-%m-%d %H:%M:%S")

    except Exception as e:
        raise e
